package com.time;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;

import java.util.Properties;

public class JclLog4jLog {

    /**
     * JCL有两个基本的抽象类： Log( 基本记录器 ) 和 LogFactory( 负责创建 Log 实例 ) 。
     * 当 commons-logging.jar 被加入到 CLASSPATH之后，它会合理地猜测你想用的日志工具，然后进行自我设置，
     * 用户根本不需要做任何设置。默认的 LogFactory 是按照下列的步骤去发现并决定那个日志工具将被使用的（按照顺序，寻找过程会在找到第一个工具时中止） :
     * <p>
     * ①首先在classpath下寻找commons-logging.properties文件。如果找到，则使用其中定义的Log实现类，
     * 如果找不到，则在查找是否已定义系统环境变量org.apache.commons.logging.Log，找到则使用其定义的Log实现类；
     * <p>
     * ②查看classpath中是否有Log4j的包，如果发现，则自动使用Log4j作为日志实现类；
     * <p>
     * ③否则，使用JDK自身的日志实现类（JDK1.4以后才有日志实现类）；
     * <p>
     * ④否则，使用commons-logging自己提供的一个简单的日志实现类SimpleLog；
     * <p>
     * <p>
     * org.apache.commons.logging.Log 的具体实现有如下：
     * <p>
     * ---org.apache.commons.logging.impl.Jdk14Logger 　使用 JDK1.4 。
     * <p>
     * ---org.apache.commons.logging.impl.Log4JLogger 　使用 Log4J 。
     * <p>
     * ---org.apache.commons.logging.impl.LogKitLogger  使用 avalon-Logkit 。
     * <p>
     * ---org.apache.commons.logging.impl.SimpleLog 　  使用 common-logging 自带日志实现类。
     * <p>
     * ---org.apache.commons.logging.impl.NoOpLog      使用 common-logging 自带日志实现类。它实现了 Log 接口。 其输出日志的方法中不进行任何操作。
     * <p>
     * <p>
     * 这里在配置文件下创建commons-logging.properties，并指定实现为Log4J，系统日志就会使用Log4J记录日志：
     * org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
     * <p>
     * JulLog 无配置文件指定log对象，且Classpath下已经添加了log4j包，则JCL会优先使用log4j记录日志
     * <p>
     * 使用前请先添加log4j配置文件
     */
    @Test
    public void test() {
        Log logger = LogFactory.getLog(JclLog4jLog.class);
        logger.info("JclLog若配置文件显示指定实现类Log4JLogger，则使用log4记录日志（前提是classpath下已经添加了log4j包）");
        logger.info("JClLog若无配置文件显示指定实现类或没有系统属性设定Log4JLogger，若classpath下已经添加了log4j包，则JCL也会优先使用log4j记录日志");
        logger.info("日志类：" + logger.getClass().getName());
    }
}
